home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 7 / FM Towns Free Software Collection 7.iso / ms_dos / the / the.asm next >
Assembly Source File  |  1993-11-30  |  31KB  |  1,821 lines

  1. ;**************************************************
  2. ;
  3. ;    “THe”リアル版エディタ
  4. ;
  5. ;        By 五味仁
  6. ;
  7. ;**************************************************
  8.  
  9. ;**********************************************************************
  10. ;v0.01    テストバージョン    92/04/25
  11. ;v0.10    最低機能バージョン    92/07/23~
  12. ;v0.20    超暫定バージョン      ~92/09/20
  13. ;v0.53    暫定バージョン        92/09/24
  14. ;v0.55    暫定バグフィックス    93/06/26
  15. ;v0.55a    シフト+右をサポート    93/07/14
  16. ;**********************************************************************
  17.  
  18. IDEAL
  19. DOSSEG
  20. P8086
  21. JUMPS
  22.  
  23. CR    EQU    0DH,0AH
  24. NULL    EQU    00H
  25. FULL    EQU    48*1024        ;最大編集サイズ
  26.  
  27.  
  28. SEGMENT    CODE    WORD    "CODE"
  29.     ASSUME    CS:CODE,DS:CODE,ES:CODE,SS:CODE
  30.  
  31.     ORG    100H            ;“THe.com”
  32.  
  33. ;******************************************************************************
  34. ;        スタートアップ処理
  35. ;******************************************************************************
  36. ENTRY:
  37.     CLD
  38.     MOV    AX,CS
  39.     MOV    DS,AX            ;DSをCSに合わせる
  40.     MOV    ES,AX
  41.  
  42. ;******************************
  43. ;    コマンドライン
  44. ;******************************
  45. GETCMD:
  46.     MOV    SI,81H            ;移し元ポインタ(双方とも、)
  47.     XOR    BP,BP            ;ポインタのポインタ
  48.     JMP    GETCMD4
  49.  
  50.  
  51. GETCMDP:
  52.     MOV    [WORD CMDPOINTER+BP],SI
  53.     INC    BP
  54.     INC    BP            ;ポインタ設定
  55. GETCMD2:
  56.     CMP    [BYTE SI],0DH
  57.     JE    GETCMD5            ;最後の処理へ
  58.  
  59.     CMP    [BYTE SI],20H
  60.     JE    GETCMD3            ;飛ばし処理へ
  61.  
  62.     INC    SI
  63.     JMP    GETCMD2
  64.  
  65. GETCMD3:
  66.     MOV    [BYTE SI],00H
  67.     INC    SI            ;まずヌル入れ
  68. GETCMD4:
  69.     CMP    [BYTE SI],0DH
  70.     JE    GETCMD5            ;最後の処理へ
  71.     CMP    [BYTE SI],20H
  72.     JNE    GETCMDP            ;スペースじゃなかったら帰る
  73.  
  74.     INC    SI
  75.     JMP    GETCMD4            ;スペースだったら移動してまた調べる
  76.  
  77. GETCMD5:
  78.     MOV    [BYTE SI],00H        ;埋め込んで終わり
  79.     MOV    [WORD CMDCOUNTER],BP
  80.  
  81.  
  82.  
  83.     XOR    BX,BX
  84.     MOV    DX,0FFFFH
  85. READCMD:
  86.     CMP    BP,BX
  87.     JE    READEND
  88.  
  89.     MOV    DI,[WORD CMDPOINTER+BX]
  90.     CMP    [BYTE DI],"-"
  91.     JE    OP_READ
  92.     CMP    [BYTE DI],"/"
  93.     JE    OP_READ
  94.  
  95.     MOV    DX,DI
  96.  
  97. COMEREAD:
  98.     INC    BX
  99.     INC    BX
  100.     JMP    READCMD
  101.  
  102. OP_READ:
  103.     JMP    COMEREAD        ;現行、オプション無し
  104.  
  105. READEND:
  106.     CMP    DX,0FFFFH
  107.     JNE    READEND2        ;ファイル名指定なら、ロードへ
  108.  
  109.     MOV    [BYTE FNAME],NULL
  110.     JMP    MAIN
  111. READEND2:
  112.     MOV    SI,DX
  113.     MOV    DI,OFFSET FNAME
  114.     CALL    STRCPY
  115.  
  116.     CALL    LOAD
  117.  
  118. ;******************************************************************************
  119. ;        初期設定と画面を描く
  120. ;******************************************************************************
  121.  
  122. MAIN:
  123.     MOV    AX,0501H
  124.     INT    90H            ;クリック音無し
  125.  
  126.     MOV    AH,00H
  127.     INT    91H            ;コンソールBIOS初期化(消去)
  128.  
  129.     MOV    AH,09H
  130.     MOV    AL,11110000B
  131.     INT    91H            ;カーソル形状設定(ボックス)
  132.  
  133.     MOV    AH,1BH
  134.     MOV    AL,01000010B
  135.     INT    91H            ;表示属性の決定
  136.  
  137.     MOV    AX,CS
  138.     MOV    [WORD SYSLINE+02H],AX
  139.     MOV    [WORD SYSLINE+06H],AX
  140.     MOV    AX,1F01H
  141.     MOV    CX,70
  142.     MOV    DL,01H
  143.     MOV    DI,OFFSET SYSLINE
  144.     INT    91H            ;システム行書き込み。
  145.  
  146.     MOV    AH,11H
  147.     MOV    DI,OFFSET SYSATTLIB+4
  148.     INT    91H            ;リバース
  149.  
  150.     MOV    AH,1EH
  151.     MOV    CX,160
  152.     MOV    DI,OFFSET UPPART
  153.     INT    91H            ;上の文字を書く
  154.  
  155.     MOV    AH,11H
  156.     MOV    DI,OFFSET SYSATTLIB+0
  157.     INT    91H            ;リバース解除
  158.  
  159.     MOV    BX,OFFSET EBUF
  160.     MOV    [WORD CURP],BX
  161.     MOV    [WORD NOWL],BX        ;ポインタセット
  162.  
  163.     CMP    [BYTE FNAME],NULL
  164.     JE    READ            ;ファイル名。無指定なら、読み込みへ
  165.  
  166.     CALL    NOWLINE
  167.     CALL    SCREEN            ;画面表示
  168.     MOV    CX,01
  169.     CALL    NS_PUT            ;現在の状態を書く
  170.     CALL    W_FNAME            ;ファイル名を書く
  171.  
  172. ;******************************************************************************
  173. ;        キー読み取り(事実上メイン)
  174. ;******************************************************************************
  175.  
  176. OAKLOOP1:
  177.     MOV    [WORD CHAN],0
  178.     CALL    PUTCUR
  179.  
  180.     MOV    AX,0900H
  181.     INT    90H        ;一文字入力。フリーウェアで(DOSで)、
  182.                 ;漢字の処理も、ここでやってくれる。
  183.     CMP    DL,20H
  184.     JB    OAKLOOP1B    ;普通のキー入力ならそこへ
  185.  
  186. NOR_KEY:
  187. ;********************************
  188. ;    普通のキー入力
  189. ;********************************
  190.     CMP    [WORD LEN],FULL
  191.     JA    OAKLOOP1        ;サイズオーバーなら無効
  192.  
  193.     INC    [WORD CHAN]        ;一括の為のカウンター
  194.  
  195.     MOV    SI,OFFSET EBUF
  196.     ADD    SI,[WORD LEN]
  197.     MOV    DI,SI
  198.     MOV    CX,SI
  199.     SUB    CX,[WORD CURP]        ;差を出す
  200.  
  201.     DEC    SI
  202.     STD
  203.     REP    MOVSB
  204.     CLD
  205.  
  206.     MOV    BX,[WORD CURP]
  207.     MOV    [BYTE BX],DL
  208.     INC    [WORD LEN]
  209.     INC    [WORD CURP]
  210.     MOV    [BYTE PF],1
  211.  
  212.     MOV    AH,07H
  213.     INT    90H
  214.  
  215.     CMP    DH,0FFH
  216.     JNE    NOR_KEY2        ;入力文字無しは?
  217.  
  218. NOR_KEY1A:
  219.     CALL    NOWLINE
  220.  
  221.     MOV    AX,[WORD CHAN]
  222.     SUB    [WORD CURP],AX
  223. NOR_LOOP:
  224.     DEC    [WORD CHAN]
  225.     CALL    CHARIGHT
  226.     CMP    [WORD CHAN],0
  227.     JNE    NOR_LOOP
  228.  
  229.     MOV    CX,[WORD CURL]
  230.     CALL    NS_PUT
  231.     CALL    SCREEN
  232.  
  233.     JMP    OAKLOOP1
  234.  
  235. NOR_KEY2:
  236.     CMP    DL,20H
  237.     JB    NOR_KEY1A
  238.  
  239.     MOV    AX,0900H
  240.     INT    90H
  241.  
  242.     JMP    NOR_KEY
  243.  
  244.  
  245.  
  246. OAKLOOP1B:
  247.     CMP    DL,9
  248.     JE    NOR_KEY        ;タブ入力
  249.  
  250.     CMP    DL,1EH
  251.     JNE    OAKLOOP2
  252.  
  253. ;********************************
  254. ;    上移動
  255. ;********************************
  256.  
  257.     MOV    AX,0600H
  258.     INT    90H        ;バッファのクリア
  259.     MOV    DI,01
  260.  
  261.     AND    BL,00000100B
  262.     CMP    BL,00000100B
  263.     JNE    NORMALUP
  264.  
  265.     MOV    DI,10
  266. NORMALUP:
  267.     CALL    CURUP
  268.     CALL    NS_PUT            ;現在の状態を書く
  269.     CALL    SCREEN            ;画面表示
  270.     JMP    OAKLOOP1
  271.  
  272. OAKLOOP2:
  273.     CMP    DL,1FH
  274.     JNE    OAKLOOP3
  275.  
  276. ;********************************
  277. ;    下移動
  278. ;********************************
  279.  
  280.     MOV    AX,0600H
  281.     INT    90H        ;バッファのクリア
  282.     MOV    DI,01
  283.  
  284.     AND    BL,00000100B
  285.     CMP    BL,00000100B
  286.     JNE    NORMALDOWN
  287.  
  288.     MOV    DI,10
  289. NORMALDOWN:
  290.     CALL    CURDOWN
  291.     CALL    NS_PUT            ;現在の状態を書く
  292.     CALL    SCREEN            ;画面表示
  293.     JMP    OAKLOOP1
  294.  
  295. OAKLOOP3:
  296.     CMP    DL,1CH
  297.     JNE    OAKLOOP4
  298.  
  299. ;********************************
  300. ;    右移動
  301. ;********************************
  302.  
  303.     MOV    AX,0600H
  304.     INT    90H        ;バッファのクリア
  305.     AND    BL,00000100B
  306.     CMP    BL,00000100B
  307.     JNE    NORMALRIGHT
  308.  
  309. SHIFTRIGHT:
  310.     MOV    BX,[WORD CURL]
  311.     CMP    BX,[WORD LLINE]
  312.     JA    SR_SKIP
  313.  
  314.     SHL    BX,1
  315.     MOV    BX,[WORD ELINE+BX]
  316.     MOV    [WORD CURP],BX
  317.     INC    [WORD CURL]
  318.     MOV    [BYTE CURX],1
  319. SR_SKIP:
  320.     CALL    CURLEFT
  321.     CALL    NS_PUT            ;現在の状態を書く
  322.     CALL    SCREEN            ;画面表示
  323.     JMP    OAKLOOP1
  324.  
  325. NORMALRIGHT:
  326.     CALL    CURRIGHT
  327.     CALL    NS_PUT            ;現在の状態を書く
  328.     CALL    SCREEN            ;画面表示
  329.     JMP    OAKLOOP1
  330.  
  331. OAKLOOP4:
  332.     CMP    DL,1DH
  333.     JNE    OAKLOOP5
  334.  
  335. ;********************************
  336. ;    左移動
  337. ;********************************
  338.  
  339.     MOV    AX,0600H
  340.     INT    90H        ;バッファのクリア
  341.     TEST    BL,01100100B
  342.     JE    NORMALLEFT
  343.  
  344. SHIFTLEFT:
  345.     MOV    BX,[WORD CURL]
  346.     MOV    CX,BX
  347.     DEC    BX
  348.     SHL    BX,1
  349.     MOV    BX,[WORD ELINE+BX]
  350.     MOV    [WORD CURP],BX
  351.     CALL    NS_PUT            ;現在の状態を書く
  352.     CALL    SCREEN            ;画面表示
  353.     JMP    OAKLOOP1
  354.  
  355. NORMALLEFT:
  356.     CALL    CURLEFT
  357.     CALL    NS_PUT            ;現在の状態を書く
  358.     CALL    SCREEN            ;画面表示
  359.     JMP    OAKLOOP1
  360.  
  361. OAKLOOP5:
  362.     CMP    DL,0DH
  363.     JNE    OAKLOOP6
  364.  
  365. ;********************************
  366. ;    リターン
  367. ;********************************
  368.     CMP    [WORD LEN],FULL
  369.     JA    OAKLOOP1        ;サイズオーバーなら無効
  370.  
  371.     MOV    AX,0600H
  372.     INT    90H            ;バッファのクリア
  373.     MOV    SI,OFFSET EBUF
  374.     ADD    SI,[WORD LEN]
  375.  
  376.     MOV    DI,SI
  377.  
  378.     MOV    CX,SI
  379.     SUB    CX,[WORD CURP]        ;差を出す
  380.  
  381.     INC    DI
  382.     DEC    SI            ;BUG FIXED(93/06/26 )
  383.     STD
  384.     REP    MOVSB
  385.     CLD
  386.  
  387.     MOV    BX,[WORD CURP]
  388.     MOV    [BYTE BX]  ,0DH
  389.     MOV    [BYTE BX+1],0AH
  390.     INC    [WORD LEN]
  391.     INC    [WORD LEN]
  392.     MOV    [BYTE PF],1
  393.  
  394.     CALL    NOWLINE
  395.     CALL    CHARIGHT
  396.  
  397.     MOV    [BYTE PF],1
  398.     CALL    NS_PUT
  399.     CALL    SCREEN
  400.     JMP    OAKLOOP1
  401.  
  402. OAKLOOP6:
  403.     CMP    DL,08H
  404.     JNE    OAKLOOP7
  405.  
  406. ;********************************
  407. ;    バックスペース
  408. ;********************************
  409.  
  410.     AND    BL,00000100B
  411.     CMP    BL,00000100B
  412.     JNE    NORMALBS
  413.  
  414. NORMALBS:
  415.     CALL    CURLEFT
  416.     MOV    [BYTE PF],0    ;変更なし、として、下のルーチンの時間をかせぐ
  417.     CALL    SCREEN        ;その場所が全角か半角かを求めるのに使っている
  418.  
  419.     JMP    DEKEY        ;実は、バックスペースは、左+削除だ!
  420.  
  421. OAKLOOP7:
  422.  
  423. OAKPFKEY1:
  424.     MOV    AX,0600H
  425.     INT    90H        ;バッファのクリア
  426. ;********************************
  427. ;    終了
  428. ;********************************
  429.  
  430.     CMP    BH,66H            ;PF10(終了)
  431.     JE    FIN
  432.  
  433. ;********************************
  434. ;    読み込み
  435. ;********************************
  436.  
  437.     CMP    BH,5EH            ;PF 2(読込)
  438.     JNE    WRITE
  439. READ:
  440.     CALL    INPUT_NAME
  441.     CALL    W_FNAME            ;ファイル名を書く
  442.  
  443.     JMP    FOR_RENAME
  444.  
  445. ;********************************
  446. ;    更新
  447. ;********************************
  448. WRITE:
  449.     CMP    BH,61H            ;PF 5(更新)
  450.     JNE    SAVEND
  451.  
  452.     CALL    UPDATE
  453.     JMP    OAKLOOP1
  454.  
  455. ;********************************
  456. ;    保存
  457. ;********************************
  458. SAVEND:
  459.     CMP    BH,5DH            ;PF 1(保存)
  460.     JNE    RENAME
  461.  
  462.     CALL    UPDATE            ;保存へ
  463.     CMP    AX,0
  464.     JE    FIN            ;エラーだったら終了せず
  465.  
  466.     JMP    OAKLOOP1
  467.  
  468. ;********************************
  469. ;    改名
  470. ;********************************
  471. RENAME:
  472.     CMP    BH,5FH            ;PF 3(改名)
  473.     JNE    REEDIT
  474.  
  475.     CALL    INPUT_NAME
  476.     CALL    W_FNAME            ;ファイル名を書く
  477.     MOV    [BYTE PF],1
  478.     CALL    SCREEN            ;画面表示
  479.  
  480.     JMP    OAKLOOP1
  481.  
  482. ;********************************
  483. ;    再編集
  484. ;********************************
  485. REEDIT:
  486.     CMP    BH,60H            ;PF 4(再編集)
  487.     JNE    DELE
  488.  
  489. FOR_RENAME:
  490.     MOV    DX,OFFSET FNAME
  491.     CALL    LOAD
  492.  
  493.     CALL    NOWLINE
  494.     CALL    NS_PUT            ;現在の状態を書く
  495.     CALL    SCREEN            ;画面表示
  496.     JMP    OAKLOOP1
  497.  
  498. ;********************************
  499. ;    削除
  500. ;********************************
  501. DELE:
  502.     CMP    BH,4BH
  503.     JNE    OAKPFKEY2        ;削除
  504. DEKEY:
  505.     MOV    DI,[WORD CURP]
  506.     MOV    AL,[BYTE DI]
  507.     MOV    AH,[BYTE DI+1]        ;リターンコード処理
  508.     MOV    BP,OFFSET EBUF
  509.     ADD    BP,[WORD LEN]        ;しょっちゅう出てくるから、作ろうか?
  510.     CMP    DI,BP
  511.     JE    OAKLOOP1
  512.  
  513.     MOV    SI,DI
  514.     INC    SI
  515.  
  516.     CMP    AL,0DH
  517.     JNE    DEKEY2
  518.     CMP    AH,0AH
  519.     JNE    DEKEY2
  520.  
  521.     INC    SI            ;リターンコード一括削除
  522.     DEC    [WORD LEN]        ;更新
  523. DEKEY2:
  524.     MOV    AX,[WORD ZHF]
  525.     ADD    SI,AX            ;全角か?
  526.     SUB    [WORD LEN],AX
  527.  
  528.     MOV    CX,BP
  529.     SUB    CX,SI            ;差を出す
  530.  
  531.     REP    MOVSB            ;CLD前提
  532.  
  533.     DEC    [WORD LEN]        ;更新
  534. DEKEY3:
  535.     CALL    NOWLINE
  536.  
  537.     MOV    [BYTE PF],1
  538.     CALL    NS_PUT
  539.     CALL    SCREEN
  540.     JMP    OAKLOOP1
  541.  
  542. OAKPFKEY2:
  543.     JMP    OAKLOOP1        ;判読不能
  544.  
  545.  
  546. ;****************************************************************************
  547. ;    壮大な終了!!
  548. ;
  549. ;    また起動するのだ。
  550. ;****************************************************************************
  551. FIN:
  552.     MOV    AX,0600H
  553.     INT    90H        ;バッファのクリア
  554.     XOR    AH,AH
  555.     INT    91H        ;コンソールBIOS初期化
  556.  
  557.     MOV    AH,4CH
  558.     INT    21H
  559.  
  560.  
  561. ;****************************************************************************
  562. ;    更新ルーチン
  563. ;
  564. ;
  565. ;****************************************************************************
  566. PROC    UPDATE
  567.  
  568.     MOV    AH,3CH
  569.     MOV    DX,OFFSET FNAME
  570.     MOV    CX,0000000000000000B
  571.     INT    21H
  572.  
  573.     JC    UPD_ERR_RET
  574.  
  575.     MOV    BX,AX
  576.  
  577.     MOV    AH,40H
  578.     MOV    DX,OFFSET EBUF
  579.     MOV    CX,[WORD LEN]
  580.     INT    21H
  581.  
  582.     JC    UPD_ERR_RET
  583.  
  584.     MOV    AX,0
  585.     RET
  586.  
  587. UPD_ERR_RET:
  588.     MOV    AX,1            ;エラー処理
  589.     RET
  590.  
  591. ENDP
  592.  
  593. ;****************************************************************************
  594. ;    名前入力ルーチン
  595. ;
  596. ;
  597. ;****************************************************************************
  598. PROC    INPUT_NAME
  599.  
  600.     MOV    AH,11H
  601.     MOV    DI,OFFSET SYSATTLIB+4
  602.     INT    91H            ;リバース
  603.  
  604.     MOV    AH,0DH
  605.     MOV    DH,12
  606.     MOV    DL,01
  607.     INT    91H            ;カーソル移動
  608.  
  609.     MOV    AH,1EH
  610.     MOV    CX,80
  611.     MOV    DI,OFFSET SPA80
  612.     INT    91H
  613.  
  614.     MOV    AH,0DH
  615.     MOV    DH,14
  616.     MOV    DL,01
  617.     INT    91H            ;カーソル移動
  618.  
  619.     MOV    AH,1EH
  620.     MOV    CX,80
  621.     MOV    DI,OFFSET SPA80
  622.     INT    91H
  623.  
  624.     MOV    AH,11H
  625.     MOV    DI,OFFSET SYSATTLIB+0
  626.     INT    91H            ;リバース解除
  627.  
  628.     MOV    AH,0DH
  629.     MOV    DH,13
  630.     MOV    DL,01
  631.     INT    91H            ;カーソル移動
  632.  
  633.     MOV    AH,1EH
  634.     MOV    CX,80
  635.     MOV    DI,OFFSET SPA80
  636.     INT    91H
  637.  
  638.     MOV    AH,0DH
  639.     MOV    DH,13
  640.     MOV    DL,02
  641.     INT    91H            ;カーソル移動
  642.  
  643.     MOV    AH,1BH
  644.     MOV    AL,11000010B
  645.     INT    91H            ;表示属性の決定
  646.  
  647.     MOV    AH,0AH
  648.     MOV    DX,OFFSET TMP_NAME
  649.     INT    21H
  650.  
  651.     MOV    AH,1BH
  652.     MOV    AL,01000010B
  653.     INT    91H            ;表示属性の決定
  654.  
  655.     MOV    SI,OFFSET TMP_NAME+2
  656.     MOV    DI,OFFSET FNAME
  657. @@_1:
  658.     LODSB
  659.     STOSB                ;CLD前提
  660.     CMP    AL,0DH
  661.     JNE    @@_1
  662.  
  663.     MOV    [BYTE DI-1],NULL
  664.  
  665.     RET
  666.  
  667. ENDP
  668.  
  669. ;******************************************************************************
  670. ;        ファイルをロード
  671. ;IN    DX
  672. ;OUT    AX(00H=正常終了,01H=失敗)
  673. ;BREAK    AX,BX,CX,SI
  674. ;******************************************************************************
  675.  
  676. PROC    LOAD
  677.  
  678.     MOV    AX,03D00H
  679.     INT    21H        ;オープン
  680.     JC    ERET        ;エラーリターン
  681.     MOV    BX,AX        ;ファイルハンドルをBXに移す
  682.  
  683.     MOV    AX,4202H
  684.     XOR    CX,CX
  685.     XOR    DX,DX
  686.     INT    21H        ;ファイルの最後を求める
  687.  
  688.     CMP    DX,00H
  689.     JNE    ERET        ;サイズが16ビットを越えていたらエラー
  690.     CMP    AX,FULL
  691.     JA    ERET        ;サイズがFULLバイトを越えていたらエラー
  692.     MOV    [WORD LEN],AX
  693.  
  694.     MOV    AX,4200H
  695.     XOR    CX,CX
  696.     XOR    DX,DX
  697.     INT    21H        ;ファイルの最初に戻す
  698.  
  699. HNEXT:
  700.     MOV    CX,[WORD LEN]    ;一度に読む
  701.     XOR    SI,SI        ;ポインタ初期化
  702.     MOV    DX,OFFSET EBUF    ;先頭に
  703. HREAD:
  704.     MOV    AH,03FH
  705.     INT    21H
  706.     JC    ERET        ;簡易エラー表示
  707.  
  708. CLOSE:
  709.     MOV    AH,3EH
  710.     INT    21H        ;クローズ
  711.     JC    ERET        ;クローズ出来ない
  712.  
  713.     MOV    BX,OFFSET EBUF
  714.     MOV    [WORD CURP],BX
  715.     MOV    [WORD NOWL],BX    ;ポインタセット
  716.     MOV    [BYTE PF],1    ;改変されたというフラグ
  717.  
  718.     MOV    AX,00H        ;ロード完了
  719.     RET
  720.  
  721. ERET:
  722.     MOV    BX,OFFSET EBUF
  723.     MOV    [WORD CURP],BX
  724.     MOV    [WORD NOWL],BX    ;ポインタセット
  725.     MOV    [BYTE PF],1    ;改変されたというフラグ
  726.     MOV    [WORD LEN],0
  727.  
  728.     MOV    AX,01H
  729.     RET
  730.  
  731. ENDP    LOAD
  732.  
  733. ;******************************************************************************
  734. ;        スクリーン表示
  735. ;IN    NOWL
  736. ;OUT    表示
  737. ;BREAK    AX,CX,DX,BP,SI,DI,SCRBUF
  738. ;******************************************************************************
  739.  
  740. PROC    SCREEN
  741.  
  742.     PUSH    BX            ;全角フラグ
  743.     XOR    BL,BL            ;0は半角(半額では無い)
  744.  
  745.     MOV    SI,[WORD NOWL]        ;先頭行ポインタ
  746.     MOV    DI,OFFSET SCRBUF    ;表示バッファ
  747.     XOR    DX,DX            ;行、桁ポインタ
  748.     MOV    BP,[WORD LEN]        ;編集テキスト長
  749.     ADD    BP,OFFSET EBUF        ;EOFポイント
  750. SCRLOOP1:
  751.     MOV    AL,[BYTE SI]
  752.     MOV    [BYTE DI],AL
  753.  
  754.     CMP    BL,1
  755.     JE    HAN        ;前の文字が全角先頭なら次は全角後尾
  756.     CMP    AL,0DFH
  757.     JA    ZEN
  758.     CMP    AL,80H
  759.     JB    EOZ
  760.     CMP    AL,09FH
  761.     JA    EOZ        ;前が半角なら、次が全角先頭か判断
  762. ZEN:
  763.     MOV    BL,1
  764.     JMP    EOZ        ;全角先頭と判断
  765. HAN:
  766.     XOR    BL,BL        ;全角先頭のフラグを下げる
  767. EOZ:
  768.     CMP    [WORD CURP],SI
  769.     JNE    SCRLOOP1B
  770.  
  771.     PUSH    DX
  772.     INC    DL
  773.     INC    DH
  774.     INC    DH
  775.     INC    DH
  776.     MOV    [BYTE CURX],DL
  777.     MOV    [BYTE CURY],DH
  778.     POP    DX
  779.  
  780.     CMP    BL,0
  781.     JE    CZ2
  782. CZ1:
  783.     MOV    AH,09H
  784.     MOV    AL,11110000B
  785.     INT    91H            ;カーソル形状設定(全角)
  786.     MOV    [WORD ZHF],1        ;保存フラグ
  787.     JMP    SCRLOOP1B
  788. CZ2:
  789.     MOV    AH,09H
  790.     MOV    AL,01110000B
  791.     INT    91H            ;カーソル形状設定(半角)
  792.     MOV    [WORD ZHF],0        ;保存フラグ
  793.  
  794.     ;注:コンソールエミューターではカーソルの形が変えられなかった。
  795.     ;注:本物のコンソールでも変えられなかった…。
  796.  
  797. SCRLOOP1B:
  798.     CMP    BP,SI
  799.     JE    SCRPUT            ;EOFで表示へ
  800.  
  801.     CMP    DH,21
  802.     JE    SCRPUT            ;行限界で表示へ
  803.  
  804.     CMP    [BYTE SI],0DH
  805.     JNE    SCRLOOP3
  806.     DEC    BP
  807.     CMP    BP,SI
  808.     INC    BP
  809.     JE    SCRLOOP3
  810.     CMP    [BYTE SI+1],0AH
  811.     JNE    SCRLOOP3
  812.  
  813.     INC    SI
  814.     INC    SI            ;ポインタの移動
  815.     MOV    AL,20H            ;半角スペース
  816. SCRLOOP2:
  817.     CMP    DL,80
  818.     JE    SCRLOOP2E
  819.  
  820.     STOSB
  821.     INC    DL
  822.  
  823.     JMP    SCRLOOP2
  824.  
  825. SCRLOOP2E:
  826.     XOR    DL,DL
  827.     INC    DH
  828.     XOR    BL,BL
  829.  
  830.     JMP    SCRLOOP1
  831.  
  832. SCRLOOP3:
  833.     CMP    [BYTE SI],09H
  834.     JNE    SCRLOOP4
  835.     XOR    BL,BL
  836.  
  837.     INC    SI
  838.     MOV    AL,DL
  839.     SHR    AL,1
  840.     SHR    AL,1
  841.     SHR    AL,1
  842.     INC    AL
  843.     SHL    AL,1
  844.     SHL    AL,1
  845.     SHL    AL,1
  846.  
  847.     CMP    AL,80
  848.     JB    SCRLOOP3B
  849.  
  850.     MOV    AL,80
  851.  
  852. SCRLOOP3B:
  853.     MOV    [BYTE DI],20H
  854.     INC    DI
  855.     INC    DL    
  856.  
  857.     CMP    AL,DL
  858.     JNE    SCRLOOP3B
  859.  
  860.     JMP    SCRLOOP4B        ;BUG FIXED    92/07/30 22:05:49 
  861.  
  862. SCRLOOP4:
  863.     INC    SI
  864.     INC    DI
  865.     INC    DL
  866. SCRLOOP4B:
  867.     CMP    DL,80
  868.     JNE    SCRLOOP1    ;80文字目か判断
  869.  
  870.     CMP    BL,1
  871.     JNE    EOZ2        ;全角先頭か判断
  872.  
  873.     DEC    SI
  874.     DEC    DI        ;戻して
  875.     MOV    [BYTE DI],1CH    ;『→』に書換えて
  876.     XOR    DL,DL        ;桁ポインタ操作
  877.     INC    DH        ;行を増やす
  878.     INC    DI
  879.  
  880.     MOV    AL,[BYTE SI]
  881.     MOV    [BYTE DI],AL
  882.     JMP    EOZ
  883.  
  884. EOZ2:
  885.     XOR    DL,DL
  886.     INC    DH
  887.  
  888.     JMP    SCRLOOP1
  889.  
  890. SCRPUT:
  891.     CMP    DI,OFFSET SCRBUF+80*21
  892.     JE    SCRPUT2
  893.  
  894.     MOV    [BYTE DI],20H
  895.     INC    DI
  896.     JMP    SHORT    SCRPUT
  897.  
  898. SCRPUT2:
  899.     CMP    [BYTE PF],0
  900.     JE    SCRRET
  901.  
  902.     mov    ah,0bh
  903.     mov    al,1
  904.     int    91h            ;カーソル非表示
  905.  
  906.     MOV    AH,0DH
  907.     MOV    DX,0301H
  908.     INT    91H
  909.  
  910.     MOV    AH,1EH
  911.     MOV    DI,OFFSET SCRBUF
  912.     MOV    CX,80*21
  913.     INT    91H
  914.  
  915.     mov    ah,0bh
  916.     mov    al,0
  917.     int    91h            ;カーソル表示
  918.  
  919.     MOV    [BYTE PF],0
  920.  
  921. SCRRET:
  922.     POP    BX
  923.     RET
  924.  
  925. ENDP
  926.  
  927.  
  928. ;******************************************************************************
  929. ;        カーソルを描く
  930. ;IN    CURX,CURY
  931. ;OUT    表示
  932. ;BREAK    AX,DX
  933. ;******************************************************************************
  934.  
  935. PROC    PUTCUR
  936.  
  937.     MOV    DL,[BYTE CURX]
  938.     MOV    DH,[BYTE CURY]
  939.     MOV    AH,0DH
  940.     INT    91H
  941.  
  942.     RET
  943.  
  944. ENDP
  945.  
  946. ;******************************************************************************
  947. ;        文字を打った後のカーソルを右に移動
  948. ;IN    CURX,CURY
  949. ;OUT    CURX,CURY,表示,CURP,SI
  950. ;BREAK    BX,CX,DX
  951. ;******************************************************************************
  952.  
  953. PROC    CHARIGHT
  954.  
  955.     MOV    CX,[WORD CURL]
  956.     MOV    SI,[WORD CURP]
  957.  
  958.     MOV    DL,[BYTE CURX]
  959.     MOV    DH,[BYTE CURY]
  960.     MOV    BP,[WORD LEN]        ;編集テキスト長
  961.     ADD    BP,OFFSET EBUF        ;EOFポイント
  962. CHALOOP1:
  963.     CMP    [BYTE SI],0DH
  964.     JNE    CHALOOP1B
  965.     DEC    BP
  966.     CMP    SI,BP
  967.     INC    BP
  968.     JE    CHALOOP1B
  969.     CMP    [BYTE SI+1],0AH
  970.     JNE    CHALOOP1B
  971.  
  972.     INC    SI
  973. CHALOOP1B:
  974.     INC    SI
  975.  
  976.     MOV    BP,CX
  977.     SHL    BP,1
  978.     MOV    BX,[WORD ELINE+BP]    ;次の行の先頭ポインタを求める
  979.     CMP    SI,BX            ;同じなら、次の行に行っている
  980.     JNE    CHARET
  981.  
  982.     CMP    DH,22
  983.     JNE    CHALOOP2
  984.  
  985.     CALL    DOWN
  986.     INC    [BYTE PF]    ;動いた
  987.     INC    CX
  988.  
  989.     JMP    CHARET
  990.  
  991. CHALOOP2:
  992.     INC    DH        ;カーソル下
  993.     INC    CX
  994. CHARET:
  995.     MOV    [WORD CURP],SI
  996.     MOV    [WORD CURL],CX
  997.  
  998.     RET
  999.  
  1000. ENDP
  1001.  
  1002. ;******************************************************************************
  1003. ;        カーソルを右に移動
  1004. ;IN    CURX,CURY
  1005. ;OUT    CURX,CURY,表示,CURP,SI
  1006. ;BREAK    BX,CX,DX
  1007. ;******************************************************************************
  1008.  
  1009. PROC    CURRIGHT
  1010.  
  1011.     MOV    CX,[WORD CURL]
  1012.     MOV    SI,[WORD CURP]
  1013.  
  1014.     MOV    DL,[BYTE CURX]
  1015.     MOV    DH,[BYTE CURY]
  1016.     MOV    BP,[WORD LEN]        ;編集テキスト長
  1017.     ADD    BP,OFFSET EBUF        ;EOFポイント
  1018. CRILOOP1:
  1019.     CMP    SI,BP
  1020.     JE    CRIRET
  1021.  
  1022.     CMP    [WORD ZHF],1
  1023.     JE    MMRIGHT
  1024.  
  1025.     CMP    [BYTE SI],0DH
  1026.     JNE    CRILOOP1B
  1027.     DEC    BP
  1028.     CMP    SI,BP
  1029.     INC    BP
  1030.     JE    CRILOOP1B
  1031.     CMP    [BYTE SI+1],0AH
  1032.     JNE    CRILOOP1B
  1033. MMRIGHT:
  1034.     INC    SI
  1035. CRILOOP1B:
  1036.     INC    SI
  1037.  
  1038.     MOV    BP,CX
  1039.     SHL    BP,1
  1040.     MOV    BX,[WORD ELINE+BP]    ;次の行の先頭ポインタを求める
  1041.     CMP    SI,BX            ;同じなら、次の行に行っている
  1042.     JNE    CRIRET
  1043.  
  1044.     CMP    DH,22
  1045.     JNE    CRILOOP2
  1046.  
  1047.     CALL    DOWN
  1048.     INC    [BYTE PF]    ;動いた
  1049.     INC    CX
  1050.  
  1051.     JMP    CRIRET
  1052.  
  1053. CRILOOP2:
  1054.     INC    DH        ;カーソル下
  1055.     INC    CX
  1056. CRIRET:
  1057.     MOV    [WORD CURP],SI
  1058.     MOV    [WORD CURL],CX
  1059.  
  1060.     RET
  1061.  
  1062. ENDP
  1063.  
  1064. ;******************************************************************************
  1065. ;        カーソルを左に移動
  1066. ;IN    CURX,CURY
  1067. ;OUT    CURX,CURY,表示,CURP,SI
  1068. ;BREAK    BX,CX,DX
  1069. ;******************************************************************************
  1070.  
  1071. PROC    CURLEFT
  1072.  
  1073.     MOV    CX,[WORD CURL]
  1074.     MOV    SI,[WORD CURP]
  1075.  
  1076.     MOV    DL,[BYTE CURX]
  1077.     MOV    DH,[BYTE CURY]
  1078. CLELOOP1:
  1079.     CMP    SI,OFFSET EBUF
  1080.     JE    CLERET            ;左不可
  1081.  
  1082.     MOV    BP,CX
  1083.     DEC    BP
  1084.     SHL    BP,1            ;行からポインタになおす
  1085.  
  1086.     CMP    SI,[WORD ELINE+BP]
  1087.     JNE    CLELOOP2
  1088.  
  1089.     MOV    DL,79            ;理想桁指定
  1090.     MOV    DI,1
  1091.     MOV    SI,OFFSET EBUF
  1092.     MOV    [BYTE PF],0
  1093.     JMP    CUPLOOP1
  1094.  
  1095. CLELOOP2:
  1096.     DEC    DL
  1097.     JMP    CUPRET            ;超無謀!
  1098.  
  1099. CLERET:
  1100.     RET                ;おまけ
  1101.  
  1102. ENDP
  1103.  
  1104. ;******************************************************************************
  1105. ;        カーソルを上に移動
  1106. ;IN    CURX,CURY,DI
  1107. ;OUT    CURX,CURY,表示,CURP,SI
  1108. ;BREAK    BX,CX,DX
  1109. ;******************************************************************************
  1110.  
  1111. PROC    CURUP
  1112.  
  1113.     MOV    CX,[WORD CURL]
  1114.     MOV    [BYTE PF],0
  1115.  
  1116.     MOV    DL,[BYTE CURX]
  1117.     MOV    DH,[BYTE CURY]
  1118.     MOV    SI,OFFSET EBUF
  1119. CUPLOOP1:
  1120.     CMP    CX,01
  1121.     JE    CUPRET        ;移動不能
  1122.  
  1123.     CMP    DH,04
  1124.     JNE    CUPLOOP2
  1125.  
  1126.     CMP    CX,02
  1127.     JE    CUPLOOP2    ;移動不能
  1128.  
  1129.     CALL    UP
  1130.     INC    [BYTE PF]    ;動いた
  1131.     DEC    CX
  1132.  
  1133.     DEC    DI
  1134.     CMP    DI,00
  1135.     JNE    CUPLOOP1
  1136.  
  1137.     JMP    CUPRET
  1138.  
  1139. CUPLOOP2:
  1140.     DEC    DH        ;カーソル上
  1141.     DEC    CX
  1142.  
  1143.     DEC    DI        ;回数ポインタを減らす
  1144.     CMP    DI,00
  1145.     JNE    CUPLOOP1    ;無くなるまで繰り返す
  1146. CUPRET:
  1147.     MOV    BP,CX
  1148.     DEC    BP
  1149.     SHL    BP,1            ;行からポインタになおす
  1150.     MOV    BX,[WORD ELINE+BP]    ;BXに現在行頭のポインタを入れる
  1151.     MOV    [WORD CURL],CX        ;行をしまう
  1152.  
  1153.     PUSH    CX            ;何が入っていたか忘れたけど保存する
  1154.  
  1155.     XOR    DH,DH            ;DXを、目標桁とする
  1156.                     ;(DLをDXとして使う)
  1157.     MOV    CX,OFFSET EBUF
  1158.     ADD    CX,[WORD LEN]
  1159.     MOV    [WORD EBLEN],CX        ;仮のEOFポインタ
  1160.  
  1161.     XOR    CX,CX            ;CXを、現在桁とする
  1162.  
  1163. CUPRET2:
  1164.  
  1165. CUPRET2B:
  1166.     MOV    AX,BX            ;CXの過去をAXとする
  1167.  
  1168.     CMP    BX,[WORD EBLEN]
  1169.     JE    CUPRET3            ;EOFなら
  1170.  
  1171.     CMP    [BYTE BX],0DH
  1172.     JNE    CUPRET2C
  1173.     CMP    [BYTE BX+1],0AH
  1174.     JE    CUPRET3            ;リターンチェック
  1175.  
  1176. CUPRET2C:
  1177.     CMP    [BYTE BX],09H
  1178.     JNE    CUPRET2E        ;タブで無いなら飛ばす
  1179.  
  1180.     SHR    CL,1
  1181.     SHR    CL,1
  1182.     SHR    CL,1
  1183.     INC    CL
  1184.     SHL    CL,1
  1185.     SHL    CL,1
  1186.     SHL    CL,1
  1187.  
  1188.     CMP    CL,80
  1189.     JNB    CUPRET3
  1190.  
  1191. CUPRET2D:
  1192.     INC    BX            ;ポインタ移動
  1193.     JMP    SAITEUP
  1194.  
  1195. CUPRET2E:
  1196.     CMP    [BYTE BX],0DFH
  1197.     JA    ZENUP
  1198.     CMP    [BYTE BX],80H
  1199.     JB    EOZUP
  1200.     CMP    [BYTE BX],09FH
  1201.     JA    EOZUP            ;前が半角なら、次が全角先頭か判断
  1202. ZENUP:
  1203.     INC    BX
  1204.     INC    CL
  1205. EOZUP:
  1206.     INC    BX
  1207.     INC    CL            ;ポインタと桁を両方移動させる
  1208. SAITEUP:
  1209.     CMP    DX,CX
  1210.     JA    CUPRET2            ;越えていたら処理終了。越える前の値は、
  1211.                     ;AXに入っているので楽勝。
  1212. CUPRET3:
  1213.     MOV    [WORD CURP],AX        ;上を見ること
  1214.     POP    CX            ;復元
  1215.     RET
  1216.  
  1217. ENDP
  1218.  
  1219. ;******************************************************************************
  1220. ;        カーソルを下に移動
  1221. ;IN    CURX,CURY,DI
  1222. ;OUT    CURX,CURY,表示,CURP,SI
  1223. ;BREAK    BX,CX,DX
  1224. ;******************************************************************************
  1225.  
  1226. PROC    CURDOWN
  1227.  
  1228.     MOV    CX,[WORD CURL]
  1229.     MOV    [BYTE PF],0
  1230.  
  1231.     MOV    DL,[BYTE CURX]
  1232.     MOV    DH,[BYTE CURY]
  1233.     MOV    SI,OFFSET EBUF
  1234. CDNLOOP1:
  1235.     CMP    CX,[WORD LLINE]
  1236.     JE    CDNRET        ;移動不能
  1237.  
  1238.     CMP    DH,22
  1239.     JNE    CDNLOOP2
  1240.  
  1241.     CALL    DOWN
  1242.     INC    [BYTE PF]    ;動いた
  1243.     INC    CX
  1244.  
  1245.     DEC    DI
  1246.     CMP    DI,00
  1247.     JNE    CDNLOOP1
  1248.  
  1249.     JMP    CDNRET
  1250.  
  1251. CDNLOOP2:
  1252.     INC    DH        ;カーソル下
  1253.     INC    CX
  1254.  
  1255.     DEC    DI
  1256.     CMP    DI,00
  1257.     JNE    CDNLOOP1
  1258. CDNRET:
  1259.     JMP    CUPRET        ;カーソル上移動のルーチンを借りている
  1260.  
  1261.     RET
  1262.  
  1263. ENDP
  1264.  
  1265. ;******************************************************************************
  1266. ;        表示画面上移動
  1267. ;IN    NOWL
  1268. ;OUT    NOWL
  1269. ;BREAK    BP,BX
  1270. ;******************************************************************************
  1271.  
  1272. PROC    UP
  1273.  
  1274.     MOV    BP,CX
  1275. ;    MOV    BL,DH        ;DHは常に4
  1276. ;    XOR    BH,BH
  1277. ;    DEC    BL
  1278. ;    DEC    BL
  1279. ;    DEC    BL
  1280.     SUB    BP,1        ;BX → 1  汎用ルーチンとして残しておく。
  1281.     DEC    BP
  1282.     DEC    BP
  1283.     SHL    BP,1
  1284.  
  1285.     MOV    BX,[WORD ELINE+BP]
  1286.     MOV    [WORD NOWL],BX
  1287.  
  1288. UPRET:
  1289.     RET
  1290.  
  1291. ENDP
  1292.  
  1293. ;******************************************************************************
  1294. ;        表示画面下移動
  1295. ;IN    NOWL
  1296. ;OUT    NOWL
  1297. ;BREAK    BP,BX
  1298. ;******************************************************************************
  1299.  
  1300. PROC    DOWN
  1301.  
  1302.     MOV    BP,CX
  1303. ;    MOV    BL,DH        ;DHは常に22
  1304. ;    XOR    BH,BH
  1305. ;    DEC    BL
  1306. ;    DEC    BL
  1307. ;    DEC    BL
  1308.     SUB    BP,19        ;BX → 19  汎用ルーチンとして残しておく
  1309.     SHL    BP,1
  1310.  
  1311.     MOV    BX,[WORD ELINE+BP]
  1312.     MOV    [WORD NOWL],BX
  1313.  
  1314. DOWNRET:
  1315.     RET
  1316.  
  1317. ENDP
  1318.  
  1319. ;******************************************************************************
  1320. ;        現在のステータスを書く
  1321. ;IN    CURP,LEN,LLINE,CX
  1322. ;OUT    表示
  1323. ;BREAK    AH,DX,DI
  1324. ;******************************************************************************
  1325.  
  1326. PROC    NS_PUT
  1327.  
  1328.     mov    ah,0bh
  1329.     mov    al,1
  1330.     int    91h            ;カーソル非表示
  1331.  
  1332.     MOV    AH,11H
  1333.     MOV    DI,OFFSET SYSATTLIB+4
  1334.     INT    91H            ;リバース
  1335.  
  1336.     MOV    AH,0DH
  1337.     MOV    DH,02
  1338.     MOV    DL,69
  1339.     INT    91H            ;カーソル移動
  1340.  
  1341.     CALL    PUT16BIT        ;現在行を書く
  1342.  
  1343.     MOV    AH,0DH
  1344.     MOV    DH,01
  1345.     MOV    DL,69
  1346.     INT    91H            ;カーソル移動
  1347.  
  1348.     MOV    CX,[WORD CURP]
  1349.     SUB    CX,OFFSET EBUF
  1350.     CALL    PUT16BIT        ;サイズを書く
  1351.  
  1352.     MOV    AH,0DH
  1353.     MOV    DH,01
  1354.     MOV    DL,75
  1355.     INT    91H            ;カーソル移動
  1356.  
  1357.     MOV    CX,[WORD LEN]
  1358.     CALL    PUT16BIT        ;サイズを書く
  1359.  
  1360.     MOV    AH,0DH
  1361.     MOV    DH,02
  1362.     MOV    DL,75
  1363.     INT    91H            ;カーソル移動
  1364.  
  1365.     MOV    CX,[WORD LLINE]
  1366.     CALL    PUT16BIT        ;最終行を書く
  1367.  
  1368.     MOV    AH,11H
  1369.     MOV    DI,OFFSET SYSATTLIB+0
  1370.     INT    91H            ;リバース解除
  1371.  
  1372.     mov    ah,0bh
  1373.     mov    al,0
  1374.     int    91h            ;カーソル表示
  1375.  
  1376.     RET
  1377.  
  1378. ENDP
  1379.  
  1380. ;******************************************************************************
  1381. ;    ファイルネームを書く
  1382. ;
  1383. ;
  1384. ;******************************************************************************
  1385.  
  1386. PROC    W_FNAME
  1387.  
  1388. WF_LOOP:
  1389.     MOV    SI,OFFSET FNAME
  1390.     MOV    DI,SI
  1391.     DEC    DI
  1392. WF_LOOP1:
  1393.     CMP    [BYTE SI],"\"
  1394.     JE    WF_LOOP3
  1395.     CMP    [BYTE SI],NULL
  1396.     JE    WF_LOOP4
  1397.  
  1398. WF_LOOP2:
  1399.     INC    SI
  1400.     JMP    WF_LOOP1
  1401.  
  1402. WF_LOOP3:
  1403.     MOV    DI,SI
  1404.     JMP    WF_LOOP2
  1405.  
  1406. WF_LOOP4:
  1407.     INC    DI
  1408.     SUB    SI,DI
  1409.     MOV    CX,SI
  1410.     PUSH    DI
  1411.     PUSH    CX
  1412.  
  1413. FN_PUT:
  1414.     mov    ah,0bh
  1415.     mov    al,1
  1416.     int    91h            ;カーソル非表示
  1417.  
  1418.     MOV    AH,11H
  1419.     MOV    DI,OFFSET SYSATTLIB+4
  1420.     INT    91H            ;リバース
  1421.  
  1422.     MOV    AH,0DH
  1423.     MOV    DH,01
  1424.     MOV    DL,01
  1425.     INT    91H            ;カーソル移動
  1426.  
  1427.     MOV    AH,1EH
  1428.     MOV    CX,160
  1429.     MOV    DI,OFFSET UPPART
  1430.     INT    91H            ;上の文字を書く
  1431.  
  1432.     CALL    NS_PUT
  1433.  
  1434.     MOV    AH,0DH
  1435.     MOV    DH,02
  1436.     MOV    DL,17
  1437.     INT    91H            ;カーソル移動
  1438.  
  1439.     MOV    AH,11H
  1440.     MOV    DI,OFFSET SYSATTLIB+4
  1441.     INT    91H            ;リバース
  1442.  
  1443.     MOV    AH,1EH
  1444.     POP    CX
  1445.     POP    DI
  1446.     INT    91H            ;出力
  1447.  
  1448.     MOV    AH,11H
  1449.     MOV    DI,OFFSET SYSATTLIB+0
  1450.     INT    91H            ;リバース解除
  1451.  
  1452.     mov    ah,0bh
  1453.     mov    al,0
  1454.     int    91h            ;カーソル表示
  1455.  
  1456.     RET
  1457.  
  1458. ENDP
  1459.  
  1460. ;******************************************************************************
  1461. ;        現在行の割り出し(と同時に行ポインタバッファに入れる)
  1462. ;IN    〔EBUF〕
  1463. ;OUT    CX,BP(ポインタ)
  1464. ;BREAK    SI,DL
  1465. ;******************************************************************************
  1466.  
  1467. PROC    NOWLINE
  1468.  
  1469.     XOR    DH,DH        ;全角先頭フラグ
  1470.     MOV    BX,[WORD CURP]
  1471.     MOV    SI,OFFSET EBUF    ;総ポインタ
  1472.     XOR    DL,DL        ;桁ポインタ
  1473.     MOV    BP,02        ;行カウンタ
  1474.     PUSH    DI
  1475.     MOV    DI,[WORD LEN]
  1476.     ADD    DI,OFFSET EBUF
  1477.  
  1478.     JMP    NOLLOOP1
  1479. NOLCOME:
  1480.     INC    SI
  1481.     INC    DL
  1482.  
  1483. NOLLOOP1:
  1484.     MOV    AL,[BYTE SI]
  1485.  
  1486.     CMP    DH,1
  1487.     JE    HANK        ;前の文字が全角先頭なら次は全角後尾
  1488.     CMP    AL,0DFH
  1489.     JA    ZENK
  1490.     CMP    AL,80H
  1491.     JB    EOZK
  1492.     CMP    AL,09FH
  1493.     JA    EOZK        ;前が半角なら、次が全角先頭か判断
  1494. ZENK:
  1495.     MOV    DH,1
  1496.     JMP    EOZK        ;全角先頭と判断
  1497. HANK:
  1498.     XOR    DH,DH        ;全角先頭のフラグを下げる
  1499. EOZK:
  1500.     CMP    SI,BX
  1501.     JNE    NOSAVE
  1502.  
  1503.     MOV    CX,BP
  1504. NOSAVE:
  1505.     CMP    SI,DI
  1506.     JE    NOLRET
  1507.  
  1508.     CMP    DL,80
  1509.     JE    NOLLOOP2
  1510.  
  1511.     CMP    DL,79
  1512.     JNE    NOSAVE2
  1513.     CMP    DH,1
  1514.     JNE    NOSAVE2
  1515.     JMP    NOLLOOP2
  1516. NOSAVE2:
  1517.     CMP    [BYTE SI],09H
  1518.     JNE    NOLLOOP1C
  1519.  
  1520.     INC    SI
  1521.     MOV    AL,DL
  1522.     SHR    AL,1
  1523.     SHR    AL,1
  1524.     SHR    AL,1
  1525.     INC    AL
  1526.     SHL    AL,1
  1527.     SHL    AL,1
  1528.     SHL    AL,1
  1529.  
  1530. NOLLOOP1B:
  1531.     INC    DL
  1532.  
  1533.     CMP    AL,DL
  1534.     JNE    NOLLOOP1B
  1535.  
  1536.     JMP    NOLLOOP1
  1537.  
  1538. NOLLOOP1C:
  1539.     CMP    [BYTE SI],0DH
  1540.     JNE    NOLCOME
  1541.     DEC    BX
  1542.     CMP    BX,SI
  1543.     INC    BX
  1544.     JE    NOLCOME
  1545.     CMP    [BYTE SI+1],0AH
  1546.     JNE    NOLCOME
  1547.  
  1548.     INC    SI
  1549.     INC    SI
  1550. NOLLOOP2:
  1551.     MOV    [WORD ELINE+BP],SI
  1552.     INC    BP
  1553.     INC    BP
  1554.     XOR    DL,DL
  1555.     JMP    NOLLOOP1
  1556.  
  1557. NOLRET:
  1558.     MOV    AX,BP
  1559.     SHR    AX,1
  1560.     MOV    [WORD LLINE],AX
  1561.  
  1562.     MOV    BP,CX
  1563.     SHR    CX,1
  1564.     MOV    [WORD CURL],CX
  1565.  
  1566.     POP    DI
  1567.  
  1568.     RET
  1569.  
  1570. ENDP
  1571.  
  1572. ;****************************************
  1573. ;    16ビット自然数の書き出し
  1574. ;IN    CX
  1575. ;BREAK    AX、BX、CX、DX
  1576. ;****************************************
  1577. PROC    PUT16BIT
  1578.  
  1579.     MOV    AX,CX
  1580.     XOR    DX,DX
  1581.     MOV    BX,10000
  1582.     DIV    BX
  1583.     MOV    BL,AL
  1584.     ADD    AL,30H
  1585.     MOV    [BYTE GET16BUF+0],AL
  1586.     MOV    AL,BL
  1587.     MOV    BX,10000
  1588.     MUL    BX
  1589.     SUB    CX,AX
  1590.  
  1591.     MOV    AX,CX
  1592.     MOV    BX,1000
  1593.     DIV    BX
  1594.     MOV    BL,AL
  1595.     ADD    AL,30H
  1596.     MOV    [BYTE GET16BUF+1],AL
  1597.     MOV    AL,BL
  1598.     MOV    BX,1000
  1599.     MUL    BX
  1600.     SUB    CX,AX
  1601.  
  1602.     MOV    AX,CX
  1603.     MOV    BX,100
  1604.     DIV    BX
  1605.     MOV    BL,AL
  1606.     ADD    AL,30H
  1607.     MOV    [BYTE GET16BUF+2],AL
  1608.     MOV    AL,BL
  1609.     MOV    BX,100
  1610.     MUL    BX
  1611.     SUB    CX,AX
  1612.  
  1613.     MOV    AX,CX
  1614.     MOV    BX,10
  1615.     DIV    BX
  1616.     MOV    BL,AL
  1617.     ADD    AL,30H
  1618.     MOV    [BYTE GET16BUF+3],AL
  1619.     MOV    AL,BL
  1620.     MOV    BX,10
  1621.     MUL    BX
  1622.     SUB    CX,AX
  1623.  
  1624.     MOV    AX,CX
  1625.     ADD    AL,30H
  1626.     MOV    [BYTE GET16BUF+4],AL
  1627.  
  1628.     MOV    AH,1EH
  1629.     MOV    CX,5
  1630.     MOV    DI,OFFSET GET16BUF
  1631.     INT    91H
  1632.  
  1633.     RET
  1634.  
  1635. ENDP
  1636.  
  1637. ;****************************************
  1638. ;    俗に言う『strcpy』
  1639. ;IN    SI、DIに入れる。
  1640. ;OUT    BP(コピーした文字数)
  1641. ;BREAK    AL
  1642. ;****************************************
  1643. PROC    STRCPY
  1644.  
  1645.     XOR    BP,BP
  1646. STRCPY2:
  1647.     MOV    AL,[BYTE DS:SI+BP]
  1648.     MOV    [BYTE ES:DI+BP],AL
  1649.     CMP    AL,00H
  1650.     JE    STRCPY3
  1651.     INC    BP
  1652.     JMP    STRCPY2
  1653. STRCPY3:
  1654.     RET
  1655.  
  1656. ENDP
  1657.  
  1658. ;******************************************************************************
  1659. ;        初期化データ部
  1660. ;******************************************************************************
  1661.  
  1662. SYSLINE:
  1663.     DW    SYSCHAR
  1664.     DW    ?
  1665.     DW    SYSATTLIB
  1666.     DW    ?
  1667.  
  1668. SYSCHAR:
  1669.     DB    "  ",4AH,5DH,42H,38H," "    ;保存
  1670.     DB    "  ",46H,49H,39H,7EH," "    ;読込
  1671.     DB    "  ",32H,7EH,4CH,3EH," "    ;改名
  1672.     DB    " ",3AH,46H,4AH,54H,3DH,38H    ;再編集
  1673.     DB    "  ",39H,39H,3FH,37H," "    ;更新
  1674.     DB    "       "
  1675.     DB    "       "
  1676.     DB    "       "
  1677.     DB    "       "
  1678.     DB    "  ",3DH,2AH,4EH,3BH," "    ;終了
  1679.  
  1680. SYSATTLIB:
  1681.     DB    00H,00000000B,7,0
  1682.     DB    00H,00001000B,7,0
  1683.     DB    01H,00001000B,7,0
  1684.     DB    03H,00001000B,7,0
  1685.     DB    01H,00001000B,7,0
  1686.     DB    03H,00001000B,7,0
  1687.     DB    00H,00001000B,7,0    ;保存
  1688.  
  1689.     DB    00H,00000000B,7,0
  1690.     DB    00H,00001000B,7,0
  1691.     DB    01H,00001000B,7,0
  1692.     DB    03H,00001000B,7,0
  1693.     DB    01H,00001000B,7,0
  1694.     DB    03H,00001000B,7,0
  1695.     DB    00H,00001000B,7,0    ;読込
  1696.  
  1697.     DB    00H,00000000B,7,0
  1698.     DB    00H,00001000B,7,0
  1699.     DB    01H,00001000B,7,0
  1700.     DB    03H,00001000B,7,0
  1701.     DB    01H,00001000B,7,0
  1702.     DB    03H,00001000B,7,0
  1703.     DB    00H,00001000B,7,0    ;改名
  1704.  
  1705.     DB    00H,00000000B,7,0
  1706.     DB    01H,00001000B,7,0
  1707.     DB    03H,00001000B,7,0
  1708.     DB    01H,00001000B,7,0
  1709.     DB    03H,00001000B,7,0
  1710.     DB    01H,00001000B,7,0
  1711.     DB    03H,00001000B,7,0    ;再編集
  1712.  
  1713.     DB    00H,00000000B,7,0
  1714.     DB    00H,00001000B,7,0
  1715.     DB    01H,00001000B,7,0
  1716.     DB    03H,00001000B,7,0
  1717.     DB    01H,00001000B,7,0
  1718.     DB    03H,00001000B,7,0
  1719.     DB    00H,00001000B,7,0    ;更新
  1720.  
  1721.     DB    00H,00000000B,7,0
  1722.     DB    00H,00001000B,7,0
  1723.     DB    00H,00001000B,7,0
  1724.     DB    00H,00001000B,7,0
  1725.     DB    00H,00001000B,7,0
  1726.     DB    00H,00001000B,7,0
  1727.     DB    00H,00001000B,7,0
  1728.  
  1729.     DB    00H,00000000B,7,0
  1730.     DB    00H,00001000B,7,0
  1731.     DB    00H,00001000B,7,0
  1732.     DB    00H,00001000B,7,0
  1733.     DB    00H,00001000B,7,0
  1734.     DB    00H,00001000B,7,0
  1735.     DB    00H,00001000B,7,0
  1736.  
  1737.     DB    00H,00000000B,7,0
  1738.     DB    00H,00001000B,7,0
  1739.     DB    00H,00001000B,7,0
  1740.     DB    00H,00001000B,7,0
  1741.     DB    00H,00001000B,7,0
  1742.     DB    00H,00001000B,7,0
  1743.     DB    00H,00001000B,7,0
  1744.  
  1745.     DB    00H,00000000B,7,0
  1746.     DB    00H,00001000B,7,0
  1747.     DB    00H,00001000B,7,0
  1748.     DB    00H,00001000B,7,0
  1749.     DB    00H,00001000B,7,0
  1750.     DB    00H,00001000B,7,0
  1751.     DB    00H,00001000B,7,0
  1752.  
  1753.     DB    00H,00000000B,7,0
  1754.     DB    00H,00001000B,7,0
  1755.     DB    01H,00001000B,7,0
  1756.     DB    03H,00001000B,7,0
  1757.     DB    01H,00001000B,7,0
  1758.     DB    03H,00001000B,7,0
  1759.     DB    00H,00001000B,7,0    ;終了
  1760.  
  1761. UPPART:
  1762.     DB    "                             TH editor  v0.55a        "
  1763.     DB    "         SIZE[00000/00000]"
  1764.  
  1765.     DB    " Edit Filename >                                      "
  1766.     DB    "         LINE[00000/00000]"
  1767.  
  1768. SPA80:
  1769.     DB    80 DUP(20H)
  1770.  
  1771. TMP_NAME:
  1772.     DB    80
  1773.     DB    ?
  1774.     DB    80 DUP(?)    ;名前入力用
  1775.  
  1776. ;******************************************************************************
  1777. ;        未初期化データ
  1778. ;******************************************************************************
  1779.  
  1780. ELINE:
  1781.     DW    EBUF            ;先頭
  1782.     DW    1000H DUP(?)        ;テキスト行ポインタ
  1783. FNAME:
  1784.     DB    128 DUP(?)        ;ファイルネーム
  1785. CMDPOINTER:
  1786.     DW    80H DUP(?)        ;コマンドライン・バッファ
  1787. CURX:
  1788.     DB    ?            ;カーソル桁
  1789. CURY:
  1790.     DB    ?            ;カーソル行
  1791. PF:
  1792.     DB    ?            ;改変のフラグ(0=無変更)
  1793. LEN:
  1794.     DW    ?            ;テキストの長さ
  1795. CMDCOUNTER:
  1796.     DW    ?            ;コマンドライン・ポインタ
  1797. LLINE:
  1798.     DW    ?            ;テキストの最終行
  1799. EBLEN:
  1800.     DW    ?            ;EBUF+LEN(TMP)
  1801. CURP:
  1802.     DW    ?            ;カーソルポインタ
  1803. CURL:
  1804.     DW    ?            ;カーソル行
  1805. NOWL:
  1806.     DW    ?            ;表示行の先頭ポインタ
  1807. CHAN:
  1808.     DW    ?            ;文字一括数
  1809. ZHF:
  1810.     DW    ?            ;全角半角フラグ(カーソル兼)
  1811. GET16BUF:
  1812.     DB    5 DUP(?)        ;GET16BITバッファ
  1813. SCRBUF:
  1814.     DB    80*21+2 DUP(?)        ;仮テキストVRAM
  1815. EBUF:
  1816.     DB    FULL DUP(?)        ;テキストバッファ
  1817.  
  1818. ENDS        CODE
  1819.  
  1820. END    ENTRY
  1821.